// 链接：https://ac.nowcoder.com/acm/problem/262115
// 来源：牛客网
//
// 题目描述
// 小红拿到了一个数组，她每次可以进行如下操作：
// 选择一个数，使其减去
// 𝑥
// x。
// 小红希望
// 𝑘
// k 次操作之后，该数组的最大值尽可能小。请你求出这个尽可能小的最大值。
// 输入描述:
// 第一行输入三个正整数
// 𝑛
// n、
// 𝑘
// k 和
// 𝑥
// x，代表数组长度、操作次数以及每次操作减的数。
// 第二行输入
// 𝑛
// n 个正整数
// 𝑎
// 𝑖
// a
// i
// ​
//  ，代表小红拿到的数组。
//
// 1
// ≤
// 𝑛
// ≤
// 1
// 0
// 5
// 1≤n≤10
// 5
//
// 1
// ≤
// 𝑎
// 𝑖
// ,
// 𝑘
// ,
// 𝑥
// ≤
// 1
// 0
// 9
// 1≤a
// i
// ​
//  ,k,x≤10
// 9
//
// 输出描述:
// 一个整数，代表
// 𝑘
// k 次操作后，数组尽可能小的最大值。
// 示例1
// 输入
// 复制
// 5 3 5
// 4 3 11 2 1
// 输出
// 复制
// 3
// 说明
// 第一个数操作 1 次，第三个数操作 2 次，数组变成 [-1,3,1,2,1]，最大值为 3。
//______________________第一种(二分查找)_______________________________________________
// #include <stdio.h>
// #include <stdlib.h>
//
// int canAchieve(int arr[], int n, int k, int x, int target) {
//     int operations = 0;
//     for (int i = 0; i < n; i++) {
//         if (arr[i] > target) {
//             // 计算需要多少次操作才能使 arr[i] <= target
//             operations += (arr[i] - target + x - 1) / x;  // 计算 (arr[i] - target) / x 向上取整
//         }
//     }
//     return operations <= k;  // 如果所需操作次数不超过 k，则返回 true
// }
//
// int main() {
//     int n, k, x;
//     scanf("%d %d %d", &n, &k, &x);  // 输入 n, k, x
//     int arr[n];
//
//     for (int i = 0; i < n; i++) {
//         scanf("%d", &arr[i]);  // 输入数组
//     }
//
//     // 二分法的范围是 [min(arr), max(arr)]
//     int low = 0, high = 1000000000;
//     int result = high;
//
//     while (low <= high) {
//         int mid = (low + high) / 2;
//
//         if (canAchieve(arr, n, k, x, mid)) {
//             result = mid;  // 如果能达到这个最大值，尝试更小的值
//             high = mid - 1;
//         } else {
//             low = mid + 1;  // 如果不能达到，尝试更大的最大值
//         }
//     }
//
//     printf("%d\n", result);  // 输出结果
//     return 0;
// }
//______________________第二种(但时间复杂度大)_____________________________________
// #include <stdio.h>
// #include <stdlib.h>
//
// // 比较函数，用于排序
// int compare(const void *a, const void *b) {
//     return *(int*)b - *(int*)a;  // 从大到小排序
// }
//
// int main() {
//     int n, k, x;
//     scanf("%d %d %d", &n, &k, &x);  // 输入 n, k, x
//     int arr[n];
//
//     // 读取数组
//     for (int i = 0; i < n; i++) {
//         scanf("%d", &arr[i]);
//     }
//
//     // 排序数组，按从大到小的顺序
//     qsort(arr, n, sizeof(int), compare);
//
//     // 执行操作：对最大的元素进行操作
//     for (int i = 0; i < k; i++) {
//         // 每次操作选择当前最大值并减去 x
//         arr[0] -= x;
//
//         // 排序数组，确保最大值仍然在第一位
//         qsort(arr, n, sizeof(int), compare);
//     }
//
//     // 输出操作后的数组最大值
//     printf("%d\n", arr[0]);
//
//     return 0;
// }
